#!/usr/bin/python
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# ultrasonic_1.py
# Measure distance using an ultrasonic module
#
# Author : Matt Hawkins
# Date   : 09/01/2013

# Import required Python libraries
import time
import RPi.GPIO as GPIO

# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)

# Define GPIO to use on Pi
GPIO_TRIGGER = 23
GPIO_ECHO = 24
GPIO_INDICATOR = 17

# Set pins as output and input
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo
GPIO.setup(GPIO_INDICATOR, GPIO.OUT) #Indicate too close

# Suppress warnings
GPIO.setwarnings(False)

# reference distance
refdistance = 10

# tolerance
tolerance = 0.5

def main():
    print "Monitoring Distance"

    # Get distance.
    # If less than ref distance , light up LED
    while True:
        distance = getDistance()

        if distance <= refdistance:
            print "Too close!!\nDistance : %.1f cm" % distance
            GPIO.output(GPIO_INDICATOR, True)
##            while distance <= refdistance:
##                distance = getDistance()
##                if distance > refdistance:
##                    GPIO.output(GPIO_INDICATOR, False)
        else:
            GPIO.output(GPIO_INDICATOR, False)

        time.sleep(0.5)

    # Reset GPIO settings
    GPIO.cleanup()


def getDistance():
    # Set trigger to False (Low)
    GPIO.output(GPIO_TRIGGER, False)
    
    # Allow module to settle
    time.sleep(0.1)

    # Send 10us pulse to trigger
    GPIO.output(GPIO_TRIGGER, True)
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)
    start = time.time()
    while GPIO.input(GPIO_ECHO)==0:
      start = time.time()

    stop = time.time()
    while GPIO.input(GPIO_ECHO)==1:
      stop = time.time()

    # Calculate pulse length
    elapsed = stop-start

    # Distance pulse travelled in that time is time
    # multiplied by the speed of sound (cm/s)
    distance = elapsed * 34000

    # That was the distance there and back so halve the value
    return distance / 2


if __name__=="__main__":main()
